package com.baishancloud.log.quality.pojo

import scala.beans.BeanProperty


/**
 *
 * @author ziqiang.wang 
 * @date 2021/11/15 19:51
 */
class CalculateRate extends Serializable {}


/**
 * 移动端日志转化对象，取出需要的值
 *
 * @param tags                   标签
 * @param timestamp              事件时间，毫秒值
 * @param firstVideoTime         首帧时间
 * @param assetItemTimeOfSession 观看时长
 * @param bufferingCount         卡顿次数
 * @param timeOfVideo            观看的视频时间
 * @param assetItemSession       标志一次播放
 */
case class MobileLog(@BeanProperty var tags: Tags, @BeanProperty var timestamp: Long, @BeanProperty var firstVideoTime: Int, @BeanProperty var assetItemTimeOfSession: Double, @BeanProperty var bufferingCount: Double, @BeanProperty var timeOfVideo: Double, @BeanProperty var assetItemSession: String) extends Serializable


/**
 * web端日志转化对象，取出需要的值
 *
 * @param tags      标签，记得将标签中的网络类型设置为null
 * @param timestamp 事件时间，毫秒值
 * @param category  和code共同定义一个事件
 * @param code      和category共同定义一个事件
 * @param uvid      标志一次播放
 * @param value     事件上报对应的指标，可能是一个整数，也可能是一个json字符串
 */
case class WebLog(@BeanProperty var tags: Tags, @BeanProperty var timestamp: Long, @BeanProperty var category: Int, @BeanProperty var code: Int, @BeanProperty var uvid: String, @BeanProperty var value: String) extends Serializable

/**
 * 结果数据标签，计算结果值对应的key，也是日志对象中的key
 *
 * @param duration   时间粒度，固定值：5m
 * @param platform   平台：iphone=1,ipad=2,android=3。只有移动端有，在web端使用时，将该值设置为null，之后将其转化为json字符串时，就会忽略该属性
 * @param business   业务：直播、点播
 * @param source     来源：mobile、web
 * @param domain     域名
 * @param province   区域
 * @param isp        运营商
 * @param net_type   网络类型：只有移动端有，在web端使用时，将该值设置为null，之后将其转化为json字符串时，就会忽略该属性
 * @param cache      CDN ip对应cache组信息。只有移动端有，在web端使用时，将该值设置为null，之后将其转化为json字符串时，就会忽略该属性
 * @param value_type 首帧8分位：firstFrame8Percent、时长卡顿率：timeCardFrameRate、vv卡顿率：vvCardFrameRate、加载失败率：loadFailedRate
 */
case class Tags(@BeanProperty var duration: String, @BeanProperty var platform: String, @BeanProperty var business: String, @BeanProperty var source: String, @BeanProperty var domain: String, @BeanProperty var province: String, @BeanProperty var isp: String, @BeanProperty var net_type: String, @BeanProperty var cache: String, @BeanProperty var value_type: String) extends Serializable

case object Tags extends Serializable {
  /**
   * 获取标签对象
   *
   * @param tags      标签对象
   * @param valueType 结果数据类型
   */
  def apply(tags: Tags, valueType: String): Tags = new Tags(tags.duration, tags.platform, tags.business, tags.source, tags.domain, tags.province, tags.isp, tags.net_type, tags.cache, valueType)
}

/**
 * 比率质量指标结果数据属性
 *
 * @param numerator   分子
 * @param denominator 分母
 */
case class RateResultFields(@BeanProperty var numerator: Double, @BeanProperty var denominator: Double) extends Serializable

/**
 * 比率质量指标结果对象，最终组织为对象数组，转化为json数组作为post请求的body进行发送
 *
 * @param time     时间戳，不能距离当前时间戳 12 小时
 * @param step     步长
 * @param name     固定值：bigdata_bilibili_quality
 * @param value    结果值：对应需求中的四种类型的质量指标计算
 * @param endpoint 上报数据的主机的机器名，如果 endpoint 填空，监控终端会自动补上本机的 endpoint
 * @param tags     标签对象，也就是计算结果值对应的key
 * @param fields   包含分子、分母对应的数值
 */
case class RateResult(@BeanProperty var time: Long, @BeanProperty var step: Int, @BeanProperty var name: String, @BeanProperty var value: Double, @BeanProperty var endpoint: String, @BeanProperty var tags: Tags, @BeanProperty var fields: RateResultFields) extends Serializable


